
let sum = 0;
for (let i = 0; i < 8; i++) {
    sum += Math.pow(2, i)
}
console.log(sum)
// 进制之间的转换

// 1.将任意进制转换成10进制
console.log(parseInt('101', 2))
console.log(parseInt('101', 8))
console.log(parseInt('101', 16))
// 2. 将任意进制转化成任意进制
console.log((0x64).toString(2))
console.log((0x64).toString(8))
console.log((0x64).toString(10))
// 3.十进制转化成二进制 除2取余倒着数
// 4.十进制小数转换成二进制 乘以2取整法
// 编码的发展历程
// ASCII -> GB18030/GBK -> unicode ->UTF8
// node不支持gbk ,只支持utf8
// Buffer代表的是内存，内存是一段“固定空间”， 产生的内存是固定大小，不能随意添加
// 扩容的概念，需要动态创建一个新的内容，把内容迁移过去
const buffer1 = Buffer.alloc(5)
console.log(buffer1)
// 超过255会取余数
const buffer2 = Buffer.from([0x25,0x26,300])
// 使用索引取值时，取出来的是10进制
console.log(buffer2,buffer2[2])
const buffer3 = Buffer.from('还珠')
console.log(buffer3)
// 一般情况下，我们会alloc来声明一个buffer，或者把字符串转换成buffer使用
// 后台获取的数据都是buffer，包括后面的文件操作也都是buffer形式
// 为什么base64会减少http的请求
//将图片转换为base64编码最常见的应用应该就是
//在将网页中的一些图片转换为base64编码可以实现网页图片在网速不好的时候先于内容加载和减少HTTP的请求次数来减少网站服务器的负担。
/**
 * 图片转换成base64有两大好处
1.主要：减少了HTTP请求
我们的网站采用的都是HTTP协议，而HTTP协议是一种无状态的链接，就是连接和传输后都会断开连接节省资源。此时解决的方法就是尽量的减少HTTP请求，此时base64编码可以将图片添加到css中，实现请求css即可下载下来图片，减少了在此请求图片的请求。当然减少HTTP请求次数的方法还有很多，如css sprite技术，将网页中的小图片拼在一张大图片中，下载时只需要一次完整的HTTP请求就可以，减少了请求次数。

2.提前加载图片的应用
把css中的图片使用成base64编码的，css是在html头部引用的，要优先于下面的内容被加载，所以在网速不好的时候就会出现先加载出base64图片。

图片转换成base64有两大缺点
使用 Base64 不代表性能优化 使用 Base64 的好处是能够减少一个图片的 HTTP 请求，然而，与之同时付出的代价则是 CSS 文件体积的增大。 CSS 文件的体积直接影响渲染，导致用户会长时间注视空白屏幕。HTML 和 CSS 会阻塞渲染，而图片不会。

页面解析 CSS 生成的 CSSOM 时间增加 Base64 跟 CSS 混在一起，大大增加了浏览器需要解析CSS树的耗时。其实解析CSS树的过程是很快的，一般在几十微妙到几毫秒之间。

图片转换成base64体积到底是增大了还是缩小了
Base64图片编码原理Base64编码要求把3个8位字节（38=24）转化为4个6位的字节（46=24），之后在6位的前面补两个0，形成8位一个字节的形式。 如果剩下的字符不足3个字节，则用0填充，输出字符使用’=’，因此编码后输出的文本末尾可能会出现1或2个’=
 */

console.log('珠'.toString('base64'))
// 我们可以调用Buffer的toString方法，转换成指定的编码
console.log(Buffer.from('珠').toString('base64')) // 54+g

const r = Buffer.from('珠'); // 可以调用toString转化成指定的编码

// base64 的来源就是将每个字节多转化成 小于64的值
console.log(0xe7.toString(2));
console.log(0x8f.toString(2));
console.log(0xa0.toString(2));

// 11100111 10001111 10100000  3 x 8 =>  6 * 4
// 111001  111000 111110  100000
console.log(parseInt('111001', 2))
console.log(parseInt('111000', 2))
console.log(parseInt('111110', 2))
console.log(parseInt('100000', 2))

// 0-63 取值范围是 64
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
str += str.toLocaleLowerCase();
str += '0123456789+/';
// 57 56  62 32
console.log(str[57] + str[56] + str[62] + str[32]); // 54+g 没有加密功能

let buffer4 = Buffer.from([1,2,3,4,5]); // 内部存的是引用地址
let slicBuffer = buffer4.slice(0,1);
slicBuffer[0] = 100;
console.log(buffer4)

let arr = [[1],2,3,4];
let newArr = arr.slice(0,1); // 二维数组的slice 相当于buffer，数组中存的是引用地址slice是浅拷贝
newArr[0][0] = 100;
console.log(arr);
// buffer的copy功能
// let buf0 = Buffer.from('如意')
// let buf1 = Buffer.from('万');
// let buf2 = Buffer.from('事');

// Buffer.prototype.copy = function(targetBuffer, targetStart, sourceStart = 0, sourceEnd = this.length) {
//     for (let i = sourceStart; i < sourceEnd; i++) {
//         targetBuffer[targetStart++] = this[i];
//     }
// }
// let bigBuffer = Buffer.alloc(12); // == new Buffer(12)
// buf0.copy(bigBuffer, 6, 0, 6);
// buf1.copy(bigBuffer, 0, 0, 3);
// buf2.copy(bigBuffer, 3); // 默认后两个参数不用传递

// console.log(bigBuffer.toString())

// concat
let buf0 = Buffer.from('架构')
let buf1 = Buffer.from('珠');
let buf2 = Buffer.from('峰');
Buffer.concat = function(bufferList, length = bufferList.reduce((a, b) => a + b.length, 0)) {
    let bigBuffer = Buffer.alloc(length);
    let offset = 0;
    bufferList.forEach(buf=>{
        buf.copy(bigBuffer,offset)
        offset += buf.length
    })
    return bigBuffer
}
// http 数据是分包传递的，把每段数据进行拼接
let bigBuf = Buffer.concat([buf1, buf2, buf0],100)
console.log(bigBuf.toString('base64'))


//  isBuffer   
console.log(Buffer.isBuffer(bigBuf));
// buffer.length 
console.log(bigBuf.byteLength,bigBuf.length,Buffer.from('珠峰').length);